namespace DefaultNamespace
{
    /**
     *给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？请你找出所有满足条件且不重复的三元组。

        注意：答案中不可以包含重复的三元组。
        
         
        
        示例：
        
        给定数组 nums = [-1, 0, 1, 2, -1, -4]，
        
        满足要求的三元组集合为：
        [
          [-1, 0, 1],
          [-1, -1, 2]
        ]
        
        来源：力扣（LeetCode）
        链接：https://leetcode-cn.com/problems/3sum
        著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * 
     */
    
    public class ThreeNumSum
    {
        IList<IList<int>> result = new List<IList<int>>();

            if (nums == null ||nums.Length<3)
            {
                return result;
            }
            
            //1.排序

            for (int i = 0; i < nums.Length-1; i++)
            {
                for (int j = 0; j < nums.Length-1-i; j++)
                {
                    if (nums[j]>nums[j+1])
                    {
                        int cur = nums[j];

                        nums[j] = nums[j+1];

                        nums[j+1] = cur;
                    }
                } 
            }

            for (int i = 0; i < nums.Length; i++)
            {
                Console.WriteLine(nums[i]);
            }
            
            //双指针查找
            if (nums[0] >0)
            {
                return result;
            }

            for (int i = 0; i < nums.Length; i++)
            {

                if (i>0 && nums[i] == nums[i-1])
                {
                    continue;
                }

                int startIndex = i+1;
                int endIndex = nums.Length - 1;

                
                while (startIndex < endIndex)
                {
                    if (nums[i] + nums[startIndex]+nums[endIndex] == 0)
                    {
                        result.Add(new List<int>()
                        {
                            nums[i],
                            nums[startIndex],
                            nums[endIndex],
                        });
                        while (startIndex<endIndex && nums[startIndex] == nums[startIndex+1]) //防止重复元素
                        {
                            startIndex++;
                        }
                        
                        while (startIndex<endIndex && nums[endIndex] == nums[endIndex-1]) //防止重复元素
                        {
                            endIndex--;
                        }

                        startIndex++;
                        endIndex--;
                    }
                    else if(nums[i] + nums[startIndex]+nums[endIndex]>0)
                    {
                        endIndex--;
                    }
                    else
                    {
                        startIndex++;
                    }
                }
            }

            return result;
    }
}